package com.cskaoyan.mall.user.controller;

import com.cskaoyan.mall.common.result.Result;
import com.cskaoyan.mall.common.util.IpUtil;
import com.cskaoyan.mall.user.consts.UserCodeEnum;
import com.cskaoyan.mall.user.consts.UserConstants;
import com.cskaoyan.mall.user.dto.UserLoginDTO;
import com.cskaoyan.mall.user.query.UserInfoParam;
import com.cskaoyan.mall.user.service.UserService;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

/**
 * @Author Pudding
 * @Date 2024/7/13 10:14
 */
@RestController
public class UserController {

    @Autowired
    UserService userService;
    @Autowired
    RedissonClient redissonClient;

    /**
     * 1. 用户登录的接口实现
     *
     * 分析: 在登录接口中，业务逻辑是什么呢？
     *  a) 根据用户名和密码，查询数据库
     *  b) 如果没有查到，那么说明用户名和密码错误，返回登录失败
     *  c) 如果查到了，说明用户名和密码正确
     *      // 创建token
     *      // 把令牌token和用户信息 保存到Redis
     *  d) 返回令牌
     */
    @PostMapping("/user/login")
    public Result login(@RequestBody UserInfoParam userInfo, HttpServletRequest request) {

        //2. 构造逻辑层请求参数
        //2.1 获取请求用户浏览器的ip
            //why？在登录成功之后，保存token到Redis中，也把用户的客户端IP保存到Redis中，在后序检验用户是否登录成功时，再获取一次用户客户端的IP，然后和Redis中的IP比对，如果不一致，说明请求非法
        String ipAddress = IpUtil.getIpAddress(request);

        //2.2 构造token
        //生成uuid字符串，作为用户登录的token
        String token = UUID.randomUUID().toString().replace("-","");

        //1. 调用业务层逻辑
        UserLoginDTO userLoginDTO = userService.login(userInfo, ipAddress, token);

        if (userLoginDTO == null){
            return Result.build("登录失败", UserCodeEnum.USER_LOGIN_CHECK_FAIL);
        }

        return Result.ok(userLoginDTO);
    }

    /**
     * 2. 退出登录
     * @param request
     * @return
     */
    @GetMapping("/user/logout")
    public Result logout(HttpServletRequest request){

        //直接删除Redis中的登录信息即可
        RBucket<Object> token = redissonClient.getBucket(UserConstants.USER_LOGIN_KEY_PREFIX + request.getHeader("token"));

        token.delete();

        return Result.ok();
    }
}
